package com.doraemon.service;

import com.doraemon.dto.*;
import com.doraemon.result.PageResult;
import com.doraemon.vo.OrderPaymentVO;
import com.doraemon.vo.OrderStatisticsVO;
import com.doraemon.vo.OrderSubmitVO;
import com.doraemon.vo.OrderVO;

/**
 * 订单管理Service
 **/
public interface OrderService {

    /***
     * 用户下单
     * ---
     * @param ordersSubmitDTO 订单提交DTO类（前端参数）
     * @return: com.doraemon.result.Result<com.doraemon.vo.OrderSubmitVO> 订单提交VO类
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);

    /***
     * 订单支付
     * ---
     * @param ordersPaymentDTO 订单支付DTO类（前端参数）
     * @return: com.doraemon.result.Result<com.doraemon.vo.OrderPaymentVO> 订单支付VO类
     */
    OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO);


    /***
     * 支付成功，修改订单状态
     * ---
     * @param outTradeNo
     * @return: void
     */
    void paySuccess(String outTradeNo);

    // PageResult pageQuery(int page, int pageSize, Integer status);

    /***
     * 历史订单分页查询
     * ---
     * @param ordersPageQueryDTO 订单分页DTO类
     * @return: com.doraemon.result.Result<com.doraemon.result.PageResult>
     */
    PageResult pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);

    /***
     * 查询订单详情
     * ---
     * @param orderId 订单id
     * @return: com.doraemon.result.Result<com.doraemon.vo.OrderVO>
     */
    OrderVO details(Long orderId);

    /***
     * 取消订单
     * ---
     * @param orderId 订单id
     * @return: com.doraemon.result.Result
     */
    void cancelOrder(Long orderId);

    /***
     * 再来一单
     * ---
     * @param orderId 订单id
     * @return: com.doraemon.result.Result
     */
    void reorder(Long orderId);

    /***
     * 订单搜索
     * ---
     * @param ordersPageQueryDTO 订单分页DTO类
     * @return: com.doraemon.result.Result<com.doraemon.result.PageResult>
     */
    PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

    /***
     * 各个状态的订单数量统计
     * ---
     * @param
     * @return: com.doraemon.result.Result<com.doraemon.vo.OrderStatisticsVO>
     */
    OrderStatisticsVO statistics();

    /***
     * 接单
     * ---
     * @param ordersConfirmDTO 订单接单DTO类
     * @return: com.doraemon.result.Result
     */
    void confirm(OrdersConfirmDTO ordersConfirmDTO);

    /***
     * 拒单
     * ---
     * @param ordersRejectionDTO 订单拒单DTO类
     * @return: com.doraemon.result.Result
     */
    void rejection(OrdersRejectionDTO ordersRejectionDTO);

    /***
     * 取消订单
     * ---
     * @param ordersCancelDTO 订单取消DTO类
     * @return: com.doraemon.result.Result
     */
    void cancel(OrdersCancelDTO ordersCancelDTO);

    /***
     * 派送订单
     * ---
     * @param orderId 订单id
     * @return: com.doraemon.result.Result
     */
    void delivery(Long orderId);

    /***
     * 完成订单
     * ---
     * @param orderId 订单id
     * @return: com.doraemon.result.Result
     */
    void complete(Long orderId);

    /***
     * 用户催单
     * ---
     * @param orderId 订单id
     * @return: com.doraemon.result.Result
     */
    void reminder(Long orderId);
}
